'''
按照国际象棋的规则，皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上，并且使皇后彼此之间不能相互攻击。

给你一个整数 n ，返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案，该方案中 'Q' 和 '.' 分别代表了皇后和空位。
'''

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        res = []
        
        def backtrack(board,row):
            if row == len(board):
                res.append(row[:] for row in board)
                return 

            n = len(board[row])

            for col in range(n):
                if not isValid(board,row,col):
                    continue

                board[row][col] = 'Q'
                backtrack(board,row + 1)
                board[row][col] = '.'
            
        def isValid(board,row,col):
            n = len(board)

            for i in range(n):
                if board[i][col] == 'Q':
                    return False
            
            r,c = row - 1,col + 1
            while r >= 0 and c < n:
                if board[r][c] == 'Q':
                    return False
                r -= 1
                c += 1

            r,c = row - 1,col - 1
            while r >= 0 and c >= 0:
                if board[r][c] == 'Q':
                    return False
                r -= 1
                c -= 1
            return True
        board = [["."] * n for _ in range(n)]
        backtrack(board,0)
        return res
        
